package com.mhy.mylog;

import android.util.Log;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

/**
 * @author mahongyin 2020-04-17 9:12 @CopyRight mhy.work@qq.com
 * @description: 用Aspect注解，用于处理DebugTrace标记的方法。
 * Aspect枚举的类告诉Aspect编译器需要处理哪些类哪些方法
 */

@Aspect
public class DebugTraceTraceAspect {

    private static final String POINTCUT_METHOD =
            "execution(@com.mhy.mylog.DebugTrace * *(..))";

    private static final String POINTCUT_CONSTRUCTOR =
            "execution(@com.mhy.mylog.DebugTrace *.new(..))";

    //要处理用DebugTrace标识的方法
    @Pointcut(POINTCUT_METHOD)
    public void methodAnnotatedWithDebugTrace() {
    }

    //要处理用DebugTrace标识的构造器
    @Pointcut(POINTCUT_CONSTRUCTOR)
    public void constructorAnnotatedDebugTrace() {
    }

    //真正处理的地方  来截取所有被打上@Dexxx 标签的对象
    @Around("methodAnnotatedWithDebugTrace() || constructorAnnotatedDebugTrace()")
    public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {

        //拿到DebugTrace标识的Signature对象，该对象可以获取到DebugTrace标识的类名和方法名，
        Signature signature = joinPoint.getSignature();
        //获取类名
        String className = signature.getDeclaringType().getSimpleName();
        //获取方法名
        String methodName = signature.getName();
        //在方法名插入时间戳
        final StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        //执行方法，并拿到返回值
        Object result = joinPoint.proceed();
        //获取方法后执行的时间戳，然后可以计算方法耗时
        stopWatch.stop();
        StringBuilder stringBuilder = new StringBuilder();

        //拿到方法的参数
        Object[] args = joinPoint.getArgs();
        //拼接参数
        if (args != null && args.length > 0) {
            stringBuilder.append("[ param:");
            for (Object a : args) {
                stringBuilder.append(a);
                stringBuilder.append(",");
            }

        }
        //如果方法是void类型，则没有返回值
        if (result instanceof Void) {

        } else {
            stringBuilder.append("-->result:" + result);
        }
        stringBuilder.append("]");
        //拼接时间
        stringBuilder.append("[" + stopWatch.getTotalTimeMillis() + "ms]");
        Log.d(getClass().getSimpleName(), stringBuilder.toString());
        //打印日志
        MyLog.d2(stringBuilder.toString());
        return result;
    }
}
